package net.goutalk.glcs.common.utils;

import cn.hutool.core.util.StrUtil;
import net.goutalk.glcs.common.constant.GlobalConstant;
import net.goutalk.glcs.common.model.tree.ITreeNode;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: tanyujie
 * @Date:2022/3/7 15:45
 */
public class TreeUtil {


    public TreeUtil() {
    }

    /**
     * 构建树结构
     * @param items
     * @return
     * @param <T>
     */
    public static <T extends ITreeNode<T,V>,V> List<T> build(List<T> items) {

        List<String> notParents = new ArrayList<>();

        items.forEach((node) -> {
            V parentId = node.getParentId();

            if(node.getChildren() == null){
                node.setChildren(new ArrayList<>());
            }

            //如果在List里面 找不到当前节点的父节点，则当前节点为顶级节点
            if (items.stream().noneMatch(x -> StrUtil.equals(x.getId().toString(), String.valueOf(parentId)))) {
                notParents.add(node.getId().toString());
            }

            if (!StrUtil.isEmptyIfStr(parentId) || !StrUtil.equals(String.valueOf(parentId), GlobalConstant.FIRST_NODE_VALUE)) {
                items.stream().filter(x -> StrUtil.equals(x.getId().toString(), String.valueOf(parentId)))
                        .findAny()
                        .ifPresent(parentNode -> {
                            //如果子级为空 需要使用setChildren实例化一个空列表
                            if(parentNode.getChildren() == null){
                                parentNode.setChildren(new ArrayList<>());
                            }
                            parentNode.getChildren().add(node);
                        });
            }

        });

        return items.stream().filter(x -> StrUtil.isEmptyIfStr(x.getParentId()) || StrUtil.equals(String.valueOf(x.getParentId()), GlobalConstant.FIRST_NODE_VALUE) || notParents.contains(x.getId().toString())).collect(Collectors.toList());
    }

}
